In the past, software applications were supported by mainframe data processing systems. Such software applications may include those associated with, for example, utility, transportation, finance, government, and military installations and infrastructures. Applications were supported by mainframe systems because mainframes provide a large degree of data redundancy, enhanced data recoverability features, and sophisticated data security features.
As smaller “off-the-shelf” commodity data processing systems such as personal computers (PCs) have increased in processing power, these PCs have begun providing for these industry's data processing needs. Groups of these PCs may be networked together to increase capability. For instance, one or more personal computers may be interconnected to redundantly provide access to “legacy” data that was previously stored and maintained using a mainframe system. The personal computers may also be used to update this legacy data.
To assist in the conversion of an application from a mainframe environment to a PC environment, an emulator may execute on the PC to allow execution of the mainframe application without additional work from programmers to make the mainframe application compatible with a PC. The emulator may perform dynamic translation on a “register-to-register” basis. In other words, the emulator is implemented in a loop, where each non-native instruction of the mainframe application would be fetched, that non-native instruction would be translated to one or more native instructions performing analogous functionality, and those native instructions executed, with results then stored in a register or memory. The emulator would then fetch and execute a subsequent non-native instruction in the same manner.
Dynamic translation systems have some advantages over static translation systems, for example in that they do not require non-native code to be pre-translated to native instructions. Because the particular instructions that will be executed are generally not known until runtime (when various branches are computed and assessed), static translation can result in translation of non-native code that is not ultimately executed. However, dynamic translation systems also have drawbacks. These drawbacks primarily relate to the time required to translate each non-native instruction to native instructions during execution of the non-native code. In particular, dynamic translation requires retrieval and parsing of non-native instructions, to determine the portions of the non-native instructions that are relevant to the system, including the opcode, source, and destination data locations (e.g., registers or memory locations). Once parsed, the correct code sequence can be selected for use with the corresponding opcode, and the analogous source and destination storage locations assessed and used.
As such, improvements that would lead to lowered time required to decode non-native instructions during runtime translation would be desirable.